# -*- coding:utf-8 -*-
# 引入正则导入的模块
import re
# 生成随机数
import random
# 验证码:图片验证码，短信验证码
from . import api
# 将json字符串转为字典
from flask import request, abort, current_app, jsonify, make_response, json
from iHome.utils.captcha.captcha import captcha
from iHome import redis_store
from iHome import constants
from iHome.models import User
# 发送短信引入的模块
from iHome.utils.sms import CCP

# 导入错误码
from iHome.utils.response_code import RET


@api.route('/sms', methods=['POST'])
def send_sms():
    """1.获取参数并判断是否为空
    ２．判断手机号是否合法
    ３．取到redis中缓存的图片验证码内容
    ４．对比图片验证码内容，如果对比成功
    ５．发送短信验证码
    ６．给前端发送响应结果"""
    # 1.获取参数闭关判断是否为空
    # json字符串
    # data = request.data
    # data_dict = json.loads(data)
    data_dict = request.get_json()
    # 获取参数
    mobile = data_dict.get('mobile')
    image_code = data_dict.get('image_code')
    image_code_id = data_dict.get('image_code_id')

    # 1.判断是否为空
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不全')

    # 2.判断手机号是否合法
    if not re.match(r'^1[34578][0-9]{9}$', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式不正确')

    # 3.取到redis中缓存的图片验证码内容
    try:
        real_image_code = redis_store.get('ImageCode_'+image_code_id)
        # 3.1删除redis中图片验证码的内容
        redis_store.delete('ImageCode_'+image_code_id)
    except Exception as e:
        # 输出错误信息
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='获取验证码内容失败')

    # 没取到图片验证码是none,那么代表验证码过期
    if not real_image_code:
        return jsonify(errno=RET.NODATA, errmsg="验证码过期")

    # 4.对比图片验证码内容，如果对比成功
    if real_image_code.lower() != image_code.lower():
        return jsonify(errno=RET.DATAERR, errmsg='验证码不正确')

    # 4.1判断当前手机号是否注册过
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        # 往下执行的过程中会去判断 user是否存在，如果user没有定义，会抛出未定义的异常
        user = None# 一旦进入到exception里面的话，如果没有定义user的话，代表会往下执行
        current_app.logger.error(e)

    if user:
        return jsonify(errno=RET.DATAEXIST, errmsg="当前手机号已注册")
    # 5.发送短信验证码信息
    # 5.1　生成短信验证码内容
    result = random.randint(0, 999999)
    # 验证码内容
    sms_code = '%06d' % result
    current_app.logger.debug('短信验证码内容是：%s' % sms_code)
    # 5.2发送
    # result = CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES / 60], 1)
    # if result == 0:
    #     return jsonify(errno=RET.THIRDERR, errmsg='发送短信验证码成功')
    # 6.存储验证码内容,以便后续检验
    try:
        redis_store.set('SMS_'+mobile, sms_code, constants.SMS_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='保存验证码失败')

    # 7.发送成功
    return jsonify(errno=RET.OK, errmsg='发送成功')


@api.route('/imagecode')
def get_image_code():
    """1.取到图片编码
    ２．生成图片验证码
    ３．存储到redis中（key是图片编码，值时验证码图片的内容）
    ４．返回图片"""
    # 1.取到图片验证码
    args = request.args
    cur = args.get('cur')
    pre = args.get('pre')

    # 如果用户没有传图片的id的话，直接抛出错误
    if not cur:
        # 直接抛出异常
        abort(403)
    # 2.生成图片验证码
    # name,text,image = captcha.generate_captcha()
    _, text, image = captcha.generate_captcha()
    # 为了测试输入到控制台中
    current_app.logger.debug(text)
    # 3.存储到redis中
    # redis_store.set("key", "value", "过期时间")
    try:
        if pre:
            # 如果上一次图片的id有值的话
            redis_store.delete("ImageCode_"+pre)
        redis_store.set('ImageCode_'+cur, text, constants.IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        # 将错误信息存放到日志当中
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存图片验证码失败")
    # 4.返回图片
    response = make_response(image)
    # TODO:设置contentType image/jpg
    response.headers['Content-Type'] = 'image/jpg'
    return response